#ifndef ICAMERA_HEADER
#define ICAMERA_HEADER

enum CAMERA_GET_ENUM
{
	MODELVIEW_MATRIX = 0,
	PROJECTION_MATRIX
};

//Interface for a camera class.
//VT - 3 vector type
//MT - 4x4 matrix type
//DC - Derived class
template <typename VT,
		  typename MT,
			class DC>
class ICamera {

private:

	void IInitFrame() {
		static_cast<DC *>(this)->InitFrame();
	}

	void IRotate( const VT & axis, float angDeg ) {
		static_cast<DC *>(this)->Rotate(axis, angRad);
	}

	const MT & IGetMatrix (CAMERA_GET_ENUM flag) {
		static_cast<DC *>(this)->GetMatrix();
	}

	//These interface functions will make the compiler poop if any of them (without
	//the I on the front ) aren't implemented in the derived class.
	void ISetPos( const VT & worldPos ) {
		static_cast<DC *>(this)->SetPos( worldPos);
	}

	//Set the target we are looking at
	void ISetTarget( const VT & worldPos) {
		static_cast<DC *>(this)->SetTarget();
	}
};


#endif